DifyをAWS上に構築するワークショップをやってみた(1.シンプルなチャットボットの構築編)
こんにちは、洲崎です。
生成 AI アプリケーションをノーコードで構築できるツールである Dify をAWS上に立ち上げるワークショップがあったのでやってみました。
ボリュームがあるので、4部に分けて紹介します。
1部:Difyのデプロイ、初期設定、シンプルなチャットボットの構築 ←今回はこちら
2部:RAG チャットボットの構築
3部:エージェントの開発
4部:ワークフローの開発
実際に行うワークショップはこちらです。
Difyとは
Difyは生成AIアプリケーションをノーコードで開発できるオープンソースのプラットフォームです。
Difyのコミュニティ版はGithub上でOSSとして公開されています。
このワークショップではAWS上にDifyをデプロイして利用します。
実際にDifyを構築してみた画面はこちらです。
左側の「手順」にチャットボットに指示するプロンプトを与えたり、変数を組み込むことができます。
右側のチャットページで実際にチャットボットの動作を確認することができます。
右上で生成AIのモデルを選ぶことができます。今回はAmazon Bedrockの「Claude 3.5 Sonnet」を指定しています。
これらの設定がノーコードで実装できるというのが大きな特徴です。
ワークショップの構成図
ワークショップの構成図は以下です。
今回は検証用のため、Public SubnetにEC2を立ち上げて、その上にDifyをデプロイします。
Difyで利用するLLMはAmazon Bedrockのモデルを利用します。
ワークショップではAmazon Bedrockはus-west-2 (オレゴン)リージョンの利用でしたが、私の検証環境では諸事情によりus-west-1(バージニア)リージョンで試しました。
※この環境は通信がHTTPだったり、EC2インスタンスが1台だったりしますので、あくまで検証用として、実際に本番利用する際はHTTPSの利用や冗長化をとることが推奨されています。
事前準備
自身のAWSアカウントで行う際、以下を事前に確認しておくとよいでしょう。
- Amazon Bedrock モデルの有効化
- 利用するリージョンでモデルが有効化されているか確認します。
- ワークショップでは以下のモデルを利用するため、有効化されていない場合は事前に有効化しましょう。
- Amazon Titan Text Embeddings V2
- Anthropic Claude 3 Haiku
- Anthropic Claude 3.5 Sonnet
有効化されているかどうかは、AWSマネジメントコンソールから「Amazon Bedrock」→「基盤モデル」→「ベースモデル」で確認できます。
有効化されていない場合は、左サイドメニューの下にある「Bedrock configurations」の「モデルアクセス」から利用申請を行いましょう。
モデルの申請方法の詳細については下記のブログをご参照ください。
- Difyを構築するリージョン・各リソースの上限緩和の確認
- Dify自体はap-northeast-1 (東京) リージョンの利用を前提として作成します。
- VPCやEC2などの上限緩和に引っかからないか、注意しましょう。
- ※著者はVPCの上限緩和(デフォルト5)に引っかかり、この後に実行するCloudFormationで一回コケました。。
- Difyに登録するユーザー情報は、EC2上にホストされたDBに保持されます。
- EC2に残る情報としてはDifyのユーザー情報(メールアドレス・ユーザーID・パスワード)です。
- ワークショップ終了後のリソース削除を実施すれば DB が EC2 インスタンスごと削除されるため、その後にAWS上に残ることはありません。検証したら削除しましょう。
- ワークショップの構成では、ブラウザとEC2間の通信はHTTPで暗号化されていません。機密データは送信しないようにしましょう。
想定コスト
- ワークショップを実施する際の想定コストは以下です。
- Dify 実行環境 (EC2) : 1 時間あたり 0.06 USD 程度
- LLM (Amazon Bedrock) : ワークショップの内容通りに実行した場合、1 USD 未満
- EC2は起動している間は料金がかかり続けますので、検証が終わったらクリーンアップしましょう。
やってみる
では早速やってみます。
CloudFormationのデプロイ
AWSのマネジメントコンソールからCloudFormationを開きます。
スタックで「スタックの作成」→「新しいリソースを使用(標準)」をクリックします。
テンプレートの指定で「テンプレートファイルのアップロード」を指定し、以下のワークショップのサイトからyamlファイルをダウンロードして、指定します。
dify-self-deployment.yml
スタック名は任意の名前(画像では「DifyWorkshop」)を記載します。パラメーターはデフォルトは0.0.0.0/0ですが、必要に応じてMyIPなどでIPを絞る設定を行います。
最後にチェックマークを入れて「次へ」をクリックします。
CloudFormationのスタック実行画面でステータスが「CREATE_COMPLETE」になるのを確認します。
「出力」タブにある「InstancePublicIP」を控えておきます。
これでCloudFormationの実行は完了です。
Difyの初期設定
「InstancePublicIP」をブラウザで叩いて、Difyの画面を開きます。
「管理者アカウントの設定」の画面が出てくるので、メールアドレス、ユーザー名、パスワードを入力します。
入力すると、サインインの画面に遷移するので、メールアドレスとパスワードを入力します。
サインインが成功し、Difyの画面が表示されました。
右上のユーザーマークをクリックし、「設定」をクリックします。
「モデルプロパイダー」を開き、「AWS Bedrock」にある「セットアップ」をクリックします。
AWS RegionをBedrockを利用するリージョン(今回はUS East(N.Virginia)、Available Model Nameをanthropic.claude-3-5-sonnet-20240620-v1:0
と入力します。
(Model NameについてはBedrockのマネジメントコンソールのモデル一覧から確認できます)
「45のモデルを表示」をクリックします。
Amazon Bedrockで利用できるモデルプロパイダーが全てチェックが入っている状態になっているので、以下のモデルのみ有効にします。
- Claude 3 Haiku
- Claude 3.5 Sonnet
- amazon.titan-embeded-text-v2:0
システム推論モデルと埋め込みモデルを設定します。
- システム推論モデル:
Claude 3 Haiku
- 埋め込みモデル:
amazon.titan-embed-text-v2:0
システム推論モデルはアプリで利用されるデフォルトの推論モデルです。対話の生成や質問の提案などで利用されます。
埋め込みモデルはナレッジの取得時に利用されるモデルです。この記事では利用しませんが、RAGの利用の時に改めて説明します。
これでDifyを利用するための準備が整いました。
シンプルなチャットボットの構築
まずは、指示を与えない、プレーンなチャットボットを作成します。
「アプリを作成する」の「最初から作成」をクリックし、「チャットボット」、「基本」、でアプリアイコンと名前を設定し、作成をクリックします。
チャットボットの編集画面が表示されます。
左側はプロンプトの指示を与えたり、関数を設定することができます。
右側のチャットボックスで、実際に作成したチャットボットを試すことができます。
右上の言語モデルの選択(Claude 3 Haiku)のところで、LLMのモデルを切り替えたり、各種パラメーターを調整することができます。
右側のチャット画面で「こんにちは」と打つと、生成AIのモデルが反応してくれました。
チャット履歴をクリアにするには「リフレッシュ」をクリックします。
モデルをClaude 3.5 Sonnetに切り替えて、画像(generative-ai-use-cases-jpのAWS構成図)をアップロードしたところ、画像も認識し、構成図の説明をしてくれました。
右上の「公開する」から「更新」をクリックすると、設定が保存されます。
チャットボットに指示を与える
では次に、チャットボットにプロンプトで指示を与えてみます。
以下の文言を「オーケストレーション」にある「手順」に記載します。
あなたは、ユーザーの翻訳を支援するチャットAIです。
何も指示がなくユーザーが日本語を入力した場合は、その英訳を回答してください。
英訳の修正を依頼する入力があった場合は、その依頼に従って修正してください。
チャット欄で「明日の定例会議の議題は何ですか?」と打つと、プロンプトの指示通り、英訳にして返してくれました。
次に、チャットボット側からの最初のメッセージを表示してみます。
左下にある「機能を追加」をクリックすると、以下のポップアップが表示されるため、「会話の開始」をONにします。
左下の「会話開始」にある「オープナーを開く」をクリックし、以下の文言を記載します。
こんにちは、あなたの英語翻訳を助けるボットです。
ボタンから選んだサンプルテキストを翻訳したり、自由に入力してもらった日本語を翻訳することができます。
メッセージとともに、ユーザーに選択肢を与えることができるため、「オプションを追加」から以下の文言を追加してみます。
- こんにちは、今日は良い天気ですね。
- 明日の会議は何時からですか?
すると、右上のチャット画面で、最初に話しかけてくれるようになりました。
選択肢のボタンをクリックすると、そのまま文章が送信されます。
変数の追加
Difyでは変数を加えたプロンプトを利用することができます。
左側にある変数の箇所で「追加」から「選択」をクリックします。
変数キーをlanguage
、ユーザー入力フィールド名を言語
で設定します。
アクションにある歯車マークをクリックします。
オプションに「英語」、「中国語」、「フランス語」を入れて保存します。
手順のところの文章に先ほど作成した変数(language)を入れた形で入力します。
あなたは、ユーザーの翻訳を支援するチャットAIです。
何も指示がなくユーザーが日本語を入力した場合は、その{{language}}訳を回答してください。
{{language}}訳の修正を依頼する入力があった場合は、その依頼に従って修正してください。
会話開始の文章も変数を入れた形で入力します。
こんにちは、あなたの{{language}}翻訳を助けるボットです。
ボタンから選んだサンプルテキストを翻訳したり、自由に入力してもらった日本語を翻訳することができます。
設定が完了すると、チャット画面ではlanguage
にある言語を呼び出せるようになっています。
試しにフランス語を指定し、文章を送るとフランス語の文言で翻訳してもらうことができました。
シンプルなチャットボットの構築はこれで終了です。
最後に
Difyの環境構築とシンプルなチャットボットの動作までやってみました。
思ったよりDifyの内容のボリュームが多そうで、いろいろ触れそうで楽しみです。
次回はDifyでRAG チャットボットの構築を試してみます。
追記:RAGチャットボットの記事はこちらです。